<!DOCTYPE html>
<html CN>







<head>
	
	
	<link rel="stylesheet" href="/css/allinone.min.css"> 

	
	<!-- Global Site Tag (gtag.js) - Google Analytics -->
	<script async src="https://www.googletagmanager.com/gtag/js?id=UA-42863699-1"></script>
	<script>
		window.dataLayer = window.dataLayer || [];
		function gtag(){dataLayer.push(arguments);}
		gtag('js', new Date());
		gtag('config', 'UA-42863699-1');
	</script>
	

	<meta charset="utf-8" />
	<meta http-equiv="X-UA-Compatible" content="IE=edge" />

	<title>kubernetes 简介：API Server 和 node | Cizixs Write Here</title>

	<meta name="HandheldFriendly" content="True" />
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
	<meta name="generator" content="hexo">
	<meta name="author" content="Cizixs Wu">
	<meta name="description" content="">

	
	<meta name="keywords" content="">
	

	
	<link rel="shortcut icon" href="https://cizixs-blog.oss-cn-beijing.aliyuncs.com/006tNc79ly1g1qxfovpzyj30740743yg.jpg">
	

	
	<meta name="theme-color" content="#3c484e">
	<meta name="msapplication-TileColor" content="#3c484e">
	

	

	

	<meta property="og:site_name" content="Cizixs Write Here">
	<meta property="og:type" content="article">
	<meta property="og:title" content="kubernetes 简介：API Server 和 node | Cizixs Write Here">
	<meta property="og:description" content="">
	<meta property="og:url" content="http://cizixs.com/2016/11/07/kubernetes-intro-api-server/">

	
	<meta property="article:published_time" content="2016-11-07T00:11:00+08:00"/> 
	<meta property="article:author" content="Cizixs Wu">
	<meta property="article:published_first" content="Cizixs Write Here, /2016/11/07/kubernetes-intro-api-server/" />
	

	
	
	<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
	

	
	<script src="https://cdn.staticfile.org/highlight.js/9.10.0/highlight.min.js"></script>
	

	
	
<link rel="stylesheet" href="/css/prism-base16-ateliersulphurpool.light.css" type="text/css"></head>
<body class="post-template">
    <div class="site-wrapper">
        




<header class="site-header outer" style="z-index: 999">
    <div class="inner">
        
<nav class="site-nav"> 
    <div class="site-nav-left">
        <ul class="nav">
            <li>
                
                <a href="/" title="Home">Home</a>
                
            </li>
            
            
            <li>
                <a href="/about" title="About">About</a>
            </li>
            
            <li>
                <a href="/archives" title="Archives">Archives</a>
            </li>
            
            
        </ul> 
    </div>
    <div class="site-nav-right">
        
<div class="social-links" >
    
    <a class="social-link" title="weibo" href="https://weibo.com/1921727853" target="_blank" rel="noopener">
        <svg viewBox="0 0 1141 1024" xmlns="http://www.w3.org/2000/svg"><path d="M916.48 518.144q27.648 21.504 38.912 51.712t9.216 62.976-14.336 65.536-31.744 59.392q-34.816 48.128-78.848 81.92t-91.136 56.32-94.72 35.328-89.6 18.944-75.264 7.68-51.712 1.536-49.152-2.56-68.096-10.24-78.336-21.504-79.872-36.352-74.24-55.296-59.904-78.848q-16.384-29.696-22.016-63.488t-5.632-86.016q0-22.528 7.68-51.2t27.136-63.488 53.248-75.776 86.016-90.112q51.2-48.128 105.984-85.504t117.248-57.856q28.672-10.24 63.488-11.264t57.344 11.264q10.24 11.264 19.456 23.04t12.288 29.184q3.072 14.336 0.512 27.648t-5.632 26.624-5.12 25.6 2.048 22.528q17.408 2.048 33.792-1.536t31.744-9.216 31.232-11.776 33.28-9.216q27.648-5.12 54.784-4.608t49.152 7.68 36.352 22.016 17.408 38.4q2.048 14.336-2.048 26.624t-8.704 23.04-7.168 22.016 1.536 23.552q3.072 7.168 14.848 13.312t27.136 12.288 32.256 13.312 29.184 16.384zM658.432 836.608q26.624-16.384 53.76-45.056t44.032-64 18.944-75.776-20.48-81.408q-19.456-33.792-47.616-57.344t-62.976-37.376-74.24-19.968-80.384-6.144q-78.848 0-139.776 16.384t-105.472 43.008-72.192 60.416-38.912 68.608q-11.264 33.792-6.656 67.072t20.992 62.976 42.496 53.248 57.856 37.888q58.368 25.6 119.296 32.256t116.224 0.512 100.864-21.504 74.24-33.792zM524.288 513.024q20.48 8.192 38.912 18.432t32.768 27.648q10.24 12.288 17.92 30.72t10.752 39.424 1.536 42.496-9.728 38.912q-8.192 18.432-19.968 37.376t-28.672 35.328-40.448 29.184-57.344 18.944q-61.44 11.264-117.76-11.264t-88.064-74.752q-12.288-39.936-13.312-70.656t16.384-66.56q13.312-27.648 40.448-51.712t62.464-38.912 75.264-17.408 78.848 12.8zM361.472 764.928q37.888 3.072 57.856-18.432t21.504-48.128-15.36-47.616-52.736-16.896q-27.648 3.072-43.008 23.552t-17.408 43.52 9.728 42.496 39.424 21.504zM780.288 6.144q74.752 0 139.776 19.968t113.664 57.856 76.288 92.16 27.648 122.88q0 33.792-16.384 50.688t-35.328 17.408-35.328-14.336-16.384-45.568q0-40.96-22.528-77.824t-59.392-64.512-84.48-43.52-96.768-15.872q-31.744 0-47.104-15.36t-14.336-34.304 18.944-34.304 51.712-15.36zM780.288 169.984q95.232 0 144.384 48.64t49.152 146.944q0 30.72-10.24 43.52t-22.528 11.264-22.528-14.848-10.24-35.84q0-60.416-34.816-96.256t-93.184-35.84q-19.456 0-28.672-10.752t-9.216-23.04 9.728-23.04 28.16-10.752z" /></svg>
    </a>
    

    
    <a class="social-link" title="github" href="https://github.com/cizixs" target="_blank" rel="noopener">
        <svg viewBox="0 0 1049 1024" xmlns="http://www.w3.org/2000/svg"><path d="M524.979332 0C234.676191 0 0 234.676191 0 524.979332c0 232.068678 150.366597 428.501342 358.967656 498.035028 26.075132 5.215026 35.636014-11.299224 35.636014-25.205961 0-12.168395-0.869171-53.888607-0.869171-97.347161-146.020741 31.290159-176.441729-62.580318-176.441729-62.580318-23.467619-60.841976-58.234462-76.487055-58.234463-76.487055-47.804409-32.15933 3.476684-32.15933 3.476685-32.15933 53.019436 3.476684 80.83291 53.888607 80.83291 53.888607 46.935238 79.963739 122.553122 57.365291 152.97411 43.458554 4.345855-33.897672 18.252593-57.365291 33.028501-70.402857-116.468925-12.168395-239.022047-57.365291-239.022047-259.012982 0-57.365291 20.860106-104.300529 53.888607-140.805715-5.215026-13.037566-23.467619-66.926173 5.215027-139.067372 0 0 44.327725-13.906737 144.282399 53.888607 41.720212-11.299224 86.917108-17.383422 131.244833-17.383422s89.524621 6.084198 131.244833 17.383422C756.178839 203.386032 800.506564 217.29277 800.506564 217.29277c28.682646 72.1412 10.430053 126.029806 5.215026 139.067372 33.897672 36.505185 53.888607 83.440424 53.888607 140.805715 0 201.64769-122.553122 245.975415-239.891218 259.012982 19.121764 16.514251 35.636014 47.804409 35.636015 97.347161 0 70.402857-0.869171 126.898978-0.869172 144.282399 0 13.906737 9.560882 30.420988 35.636015 25.205961 208.601059-69.533686 358.967656-265.96635 358.967655-498.035028C1049.958663 234.676191 814.413301 0 524.979332 0z" /></svg>
    </a>
    

    
    <a class="social-link" title="stackoverflow" href="https://stackoverflow.com/users/1925083/cizixs" target="_blank" rel="noopener">
        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M15 21h-10v-2h10v2zm6-11.665l-1.621-9.335-1.993.346 1.62 9.335 1.994-.346zm-5.964 6.937l-9.746-.975-.186 2.016 9.755.879.177-1.92zm.538-2.587l-9.276-2.608-.526 1.954 9.306 2.5.496-1.846zm1.204-2.413l-8.297-4.864-1.029 1.743 8.298 4.865 1.028-1.744zm1.866-1.467l-5.339-7.829-1.672 1.14 5.339 7.829 1.672-1.14zm-2.644 4.195v8h-12v-8h-2v10h16v-10h-2z"/></svg>
    </a>
    

    

    
    <a class="social-link" title="twitter" href="https://twitter.com/cizixs" target="_blank" rel="noopener">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M30.063 7.313c-.813 1.125-1.75 2.125-2.875 2.938v.75c0 1.563-.188 3.125-.688 4.625a15.088 15.088 0 0 1-2.063 4.438c-.875 1.438-2 2.688-3.25 3.813a15.015 15.015 0 0 1-4.625 2.563c-1.813.688-3.75 1-5.75 1-3.25 0-6.188-.875-8.875-2.625.438.063.875.125 1.375.125 2.688 0 5.063-.875 7.188-2.5-1.25 0-2.375-.375-3.375-1.125s-1.688-1.688-2.063-2.875c.438.063.813.125 1.125.125.5 0 1-.063 1.5-.25-1.313-.25-2.438-.938-3.313-1.938a5.673 5.673 0 0 1-1.313-3.688v-.063c.813.438 1.688.688 2.625.688a5.228 5.228 0 0 1-1.875-2c-.5-.875-.688-1.813-.688-2.75 0-1.063.25-2.063.75-2.938 1.438 1.75 3.188 3.188 5.25 4.25s4.313 1.688 6.688 1.813a5.579 5.579 0 0 1 1.5-5.438c1.125-1.125 2.5-1.688 4.125-1.688s3.063.625 4.188 1.813a11.48 11.48 0 0 0 3.688-1.375c-.438 1.375-1.313 2.438-2.563 3.188 1.125-.125 2.188-.438 3.313-.875z"/></svg>

    </a>
    

    
    <a class="social-link" title="instagram" href="https://www.instagram.com/cizixs/" target="_blank" rel="noopener">
        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z"/></svg>
    </a>
    
    
    
</div>
    </div>
</nav>
    </div>
</header>


<main id="site-main" class="site-main outer" role="main">
    <div class="inner">
        <header class="post-full-header">
            <section class="post-full-meta">
                <time  class="post-full-meta-date" datetime="2016-11-06T16:00:00.000Z" itemprop="datePublished">
                    2016-11-7
                </time>
                
                <span class="date-divider">/</span>
                
                <a href="/categories/blog/">blog</a>&nbsp;&nbsp;
                
                
            </section>
            <h1 class="post-full-title">kubernetes 简介：API Server 和 node</h1>
        </header>
        <article class="post-full no-image">
            
            <section class="post-full-content">
                <div id="lightgallery" class="markdown-body">
                    <h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>这篇文章是整个系统的第二篇，<a href="http://cizixs.com/2016/10/25/kubernetes-intro-kubelet">上一篇文章</a>讲解了 kubelet 的功能和使用。</p>
<p>在 kubernetes 集群中，API Server 有着非常重要的角色。API Server 负责和 etcd 交互（其他组件不会直接操作 etcd，只有 API Server 这么做），是整个 kubernetes 集群的数据中心，所有的交互都是以 API Server 为核心的。简单来说，API Server 提供了一下的功能：</p>
<ul>
<li>整个集群管理的 API 接口：所有对集群进行的查询和管理都要通过 API 来进行</li>
<li>集群内部各个模块之间通信的枢纽：所有模块之前并不会之间互相调用，而是通过和 API Server 打交道来完成自己那部分的工作</li>
<li>集群安全控制：API Server 提供的验证和授权保证了整个集群的安全</li>
</ul>
<p>在这篇教程中，我们的系统架构将变成下面这个样子：</p>
<p><img src="https://cizixs-blog.oss-cn-beijing.aliyuncs.com/006tNbRwgw1f9isyaffosj31hc0u00ul.jpg" alt=""></p>
<p>我们把要配置的 pod 通过 kubectl 发送给 API Server，里面已经手动指定了要运行的节点。API Server 解析并保存对应的资源，对应的 kubelet 定时拉取数据时候发现 pod 是分配给自己的，会下载对应的配置并执行去生成 pod。</p>
<h2 id="参数介绍"><a href="#参数介绍" class="headerlink" title="参数介绍"></a>参数介绍</h2><p>API Server 主要是和 etcd 打交道，并且对外提供 HTTP 服务，以及进行安全控制，因此它的命令行提供的参数也主要和这几个方面有关。下面是一些比较重要的参数以及说明（不同版本参数可能会有不同）：</p>
<table>
<thead>
<tr>
<th>参数</th>
<th>含义</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>–advertise-address</td>
<td>通过该 ip 地址向集群其他节点公布 api server 的信息，必须能够被其他节点访问</td>
<td>nil</td>
</tr>
<tr>
<td>–allow-privileged</td>
<td>是否允许 privileged 容器运行</td>
<td>false</td>
</tr>
<tr>
<td>–admission-control</td>
<td>准入控制</td>
<td>AlwaysAdmit</td>
</tr>
<tr>
<td>–authorization-mode</td>
<td>授权模式 ，安全接口上的授权</td>
<td>AlwaysAllow</td>
</tr>
<tr>
<td>–bind-address</td>
<td>HTTPS 安全接口的监听地址</td>
<td>0.0.0.0</td>
</tr>
<tr>
<td>–secure-port</td>
<td>HTTPS 安全接口的监听端口</td>
<td>6443</td>
</tr>
<tr>
<td>–cert-dir</td>
<td>TLS 证书的存放目录</td>
<td>/var/run/kubernetes</td>
</tr>
<tr>
<td>–etcd-prefix</td>
<td>信息存放在 etcd 中地址的前缀</td>
<td>“/registry”</td>
</tr>
<tr>
<td>–etcd-servers</td>
<td>逗号分割的 etcd server 地址</td>
<td>[]</td>
</tr>
<tr>
<td>–insecure-bind-address</td>
<td>HTTP 访问的地址</td>
<td>127.0.0.1</td>
</tr>
<tr>
<td>–insecure-port</td>
<td>HTTP 访问的端口</td>
<td>8080</td>
</tr>
<tr>
<td>–log-dir</td>
<td>日志存放的目录</td>
<td></td>
</tr>
<tr>
<td>–service-cluster-ip-range</td>
<td>service 要使用的网段，使用 CIDR 格式，参考 kubernetes 中 service 的定义</td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="安装和运行"><a href="#安装和运行" class="headerlink" title="安装和运行"></a>安装和运行</h2><p>API Server 是通过提供的 <code>kube-apiserver</code> 二进制文件直接运行的，下面的例子指定了 service 分配的 ip 范围，etcd 的地址，和对外提供服务的 ip 地址：</p>
<pre><code>/usr/bin/kube-apiserver \
        --service-cluster-ip-range=10.20.0.1/24 \
        --etcd-servers=http://127.0.0.1:2379 \
        --advertise-address=192.168.8.100 \
        --bind-address=192.168.8.100 \
        --insecure-bind-address=192.168.8.100 \
        --v=4
</code></pre><p>这篇教程不会提供对 API Server 进行 HTTPS 的配置，所有的操作都是直接通过 <code>8080</code> 非安全端口访问的。</p>
<p>直接访问 <code>8080</code> 端口，API Server 会返回它提供了哪些接口：</p>
<pre><code>[root@localhost vagrant]# curl http://192.168.8.100:8080                                                                                                                                 
{
  &quot;paths&quot;: [
    &quot;/api&quot;,
    &quot;/api/v1&quot;,
    &quot;/apis&quot;,
    &quot;/apis/apps&quot;,
    &quot;/apis/apps/v1alpha1&quot;,
    &quot;/apis/autoscaling&quot;,
    &quot;/apis/autoscaling/v1&quot;,
    &quot;/apis/batch&quot;,
    &quot;/apis/batch/v1&quot;,
    &quot;/apis/batch/v2alpha1&quot;,
    &quot;/apis/extensions&quot;,
    &quot;/apis/extensions/v1beta1&quot;,
    &quot;/apis/policy&quot;,
    &quot;/apis/policy/v1alpha1&quot;,
    &quot;/apis/rbac.authorization.k8s.io&quot;,
    &quot;/apis/rbac.authorization.k8s.io/v1alpha1&quot;,
    &quot;/healthz&quot;,
    &quot;/healthz/ping&quot;,
    &quot;/logs/&quot;,
    &quot;/metrics&quot;,
    &quot;/swaggerapi/&quot;,
    &quot;/ui/&quot;,
    &quot;/version&quot;
  ]
}
</code></pre><p>而目前最重要的路径是 <code>/api/v1</code>，里面包含了 kubernetes 所有资源的操作，比如下面的 nodes：</p>
<pre><code>➜  ~ http http://192.168.8.100:8080/api/v1/nodes
HTTP/1.1 200 OK
Content-Length: 112
Content-Type: application/json
Date: Thu, 08 Sep 2016 08:14:45 GMT

{
    &quot;apiVersion&quot;: &quot;v1&quot;,
    &quot;items&quot;: [],
    &quot;kind&quot;: &quot;NodeList&quot;,
    &quot;metadata&quot;: {
        &quot;resourceVersion&quot;: &quot;12&quot;,
        &quot;selfLink&quot;: &quot;/api/v1/nodes&quot;
    }
}

</code></pre><p>API 以 json 的形式返回，会通过 <code>apiVersion</code> 来说明 API 版本号，<code>kind</code> 说明请求的是什么资源。不过这里面的内容是空的，因为目前还没有任何 kubelet 节点接入到我们的 API Server。对应的，pod 也是空的：</p>
<pre><code>➜  ~ http http://192.168.8.100:8080/api/v1/pods
HTTP/1.1 200 OK
Content-Length: 110
Content-Type: application/json
Date: Thu, 08 Sep 2016 08:18:53 GMT

{
    &quot;apiVersion&quot;: &quot;v1&quot;,
    &quot;items&quot;: [],
    &quot;kind&quot;: &quot;PodList&quot;,
    &quot;metadata&quot;: {
        &quot;resourceVersion&quot;: &quot;12&quot;,
        &quot;selfLink&quot;: &quot;/api/v1/pods&quot;
    }
}
</code></pre><h2 id="添加节点"><a href="#添加节点" class="headerlink" title="添加节点"></a>添加节点</h2><p>添加节点也非常简单，启动　<code>kubelet</code>　的时候使用　<code>--api-servers</code>　指定要接入的　API Server 就行。kubelet 启动之后，会把自己注册到指定的 API Server，然后监听 API 对应 pod 的变化，根据 API 中 pod 的实际信息来管理节点上 pod 的生命周期。</p>
<p>现在访问 <code>/api/v1/nodes</code> 就能看到已经添加进来的节点：</p>
<pre><code>➜  ~ http http://192.168.8.100:8080/api/v1/nodes
HTTP/1.1 200 OK
Content-Type: application/json
Date: Thu, 08 Sep 2016 08:27:44 GMT
Transfer-Encoding: chunked

{
    &quot;apiVersion&quot;: &quot;v1&quot;,
    &quot;items&quot;: [
        {
            &quot;metadata&quot;: {
                &quot;annotations&quot;: {
                    &quot;volumes.kubernetes.io/controller-managed-attach-detach&quot;: &quot;true&quot;
                },
                &quot;creationTimestamp&quot;: &quot;2016-09-08T08:23:01Z&quot;,
                &quot;labels&quot;: {
                    &quot;beta.kubernetes.io/arch&quot;: &quot;amd64&quot;,
                    &quot;beta.kubernetes.io/os&quot;: &quot;linux&quot;,
                    &quot;kubernetes.io/hostname&quot;: &quot;192.168.8.100&quot;
                },
                &quot;name&quot;: &quot;192.168.8.100&quot;,
                &quot;resourceVersion&quot;: &quot;65&quot;,
                &quot;selfLink&quot;: &quot;/api/v1/nodes/192.168.8.100&quot;,
                &quot;uid&quot;: &quot;74e16eba-759d-11e6-b463-080027c09e5b&quot;
            },
            &quot;spec&quot;: {
                &quot;externalID&quot;: &quot;192.168.8.100&quot;
            },
            &quot;status&quot;: {
                &quot;addresses&quot;: [
                    {
                        &quot;address&quot;: &quot;192.168.8.100&quot;,
                        &quot;type&quot;: &quot;LegacyHostIP&quot;
                    },
                    {
                        &quot;address&quot;: &quot;192.168.8.100&quot;,
                        &quot;type&quot;: &quot;InternalIP&quot;
                    }
                ],
                &quot;allocatable&quot;: {
                    &quot;alpha.kubernetes.io/nvidia-gpu&quot;: &quot;0&quot;,
                    &quot;cpu&quot;: &quot;1&quot;,
                    &quot;memory&quot;: &quot;502164Ki&quot;,
                    &quot;pods&quot;: &quot;110&quot;
                },
                &quot;capacity&quot;: {
                    &quot;alpha.kubernetes.io/nvidia-gpu&quot;: &quot;0&quot;,
                    &quot;cpu&quot;: &quot;1&quot;,
                    &quot;memory&quot;: &quot;502164Ki&quot;,
                    &quot;pods&quot;: &quot;110&quot;
                },
                &quot;conditions&quot;: [
                    {
                        &quot;lastHeartbeatTime&quot;: &quot;2016-09-08T08:27:36Z&quot;,
                        &quot;lastTransitionTime&quot;: &quot;2016-09-08T08:23:01Z&quot;,
                        &quot;message&quot;: &quot;kubelet has sufficient disk space available&quot;,
                        &quot;reason&quot;: &quot;KubeletHasSufficientDisk&quot;,
                        &quot;status&quot;: &quot;False&quot;,
                        &quot;type&quot;: &quot;OutOfDisk&quot;
                    },
                    {
                        &quot;lastHeartbeatTime&quot;: &quot;2016-09-08T08:27:36Z&quot;,
                        &quot;lastTransitionTime&quot;: &quot;2016-09-08T08:23:01Z&quot;,
                        &quot;message&quot;: &quot;kubelet has sufficient memory available&quot;,
                        &quot;reason&quot;: &quot;KubeletHasSufficientMemory&quot;,
                        &quot;status&quot;: &quot;False&quot;,
                        &quot;type&quot;: &quot;MemoryPressure&quot;
                    },
                    {
                        &quot;lastHeartbeatTime&quot;: &quot;2016-09-08T08:27:36Z&quot;,
                        &quot;lastTransitionTime&quot;: &quot;2016-09-08T08:24:56Z&quot;,
                        &quot;message&quot;: &quot;kubelet is posting ready status&quot;,
                        &quot;reason&quot;: &quot;KubeletReady&quot;,
                        &quot;status&quot;: &quot;True&quot;,
                        &quot;type&quot;: &quot;Ready&quot;
                    }
                ],
                &quot;daemonEndpoints&quot;: {
                    &quot;kubeletEndpoint&quot;: {
                        &quot;Port&quot;: 10250
                    }
                },
                &quot;images&quot;: [
                    {
                        &quot;names&quot;: [
                            &quot;172.16.1.41:5000/nginx:latest&quot;
                        ],
                        &quot;sizeBytes&quot;: 425626718
                    },
                    {
                        &quot;names&quot;: [
                            &quot;172.16.1.41:5000/hyperkube:v0.18.2&quot;
                        ],
                        &quot;sizeBytes&quot;: 207121551
                    },
                    {
                        &quot;names&quot;: [
                            &quot;172.16.1.41:5000/etcd:v3.0.4&quot;
                        ],
                        &quot;sizeBytes&quot;: 43302056
                    },
                    {
                        &quot;names&quot;: [
                            &quot;172.16.1.41:5000/busybox:latest&quot;
                        ],
                        &quot;sizeBytes&quot;: 1092588
                    },
                    {
                        &quot;names&quot;: [
                            &quot;172.16.1.41:5000/google_containers/pause:0.8.0&quot;
                        ],
                        &quot;sizeBytes&quot;: 241656
                    }
                ],
                &quot;nodeInfo&quot;: {
                    &quot;architecture&quot;: &quot;amd64&quot;,
                    &quot;bootID&quot;: &quot;48955926-11dd-4ad3-8bb0-2585b1c9215d&quot;,
                    &quot;containerRuntimeVersion&quot;: &quot;docker://1.10.3&quot;,
                    &quot;kernelVersion&quot;: &quot;3.10.0-123.13.1.el7.x86_64&quot;,
                    &quot;kubeProxyVersion&quot;: &quot;v1.3.1-beta.0.6+fbf3f3e5292fb0&quot;,
                    &quot;kubeletVersion&quot;: &quot;v1.3.1-beta.0.6+fbf3f3e5292fb0&quot;,
                    &quot;machineID&quot;: &quot;b9597c4ae5f24494833d35e806e00b29&quot;,
                    &quot;operatingSystem&quot;: &quot;linux&quot;,
                    &quot;osImage&quot;: &quot;CentOS Linux 7 (Core)&quot;,
                    &quot;systemUUID&quot;: &quot;823EB67A-057E-4EFF-AE7F-A758140CD2F7&quot;
                }
            }
        }
    ],
    &quot;kind&quot;: &quot;NodeList&quot;,
    &quot;metadata&quot;: {
        &quot;resourceVersion&quot;: &quot;65&quot;,
        &quot;selfLink&quot;: &quot;/api/v1/nodes&quot;
    }
}
</code></pre><p>我们可以看到，kubelet 收集了很多关于自身节点的信息，这些信息也会不断更新。这些信息里面不仅包含节点的系统信息（系统架构，操作系统版本，内核版本等）、还有镜像信息（节点上有哪些已经下载的 docker 镜像）、资源信息（Memory 和 Disk 的总量和可用量）、以及状态信息（是否正常，可以分配 pod等）。</p>
<h2 id="和-API-Server-通信"><a href="#和-API-Server-通信" class="headerlink" title="和 API Server 通信"></a>和 API Server 通信</h2><p>下面我们就通过 API Server 来创建 pod，而不是像上篇文章那样用拷贝文件的方式。我们把编写的 yaml 文件转换成 json 格式，保存到文件里。主要注意的是，<strong>我们指定了 nodeName 的名字，这个名字必须和之前通过 <code>/api/v1/nodes</code> 得到的结果中 <code>metadata.labels.kubernetes.io/hostname</code> 保持一致</strong>：</p>
<pre><code>[root@localhost vagrant]# cat nginx_pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-server
spec:
  nodeName: 192.168.8.100
  containers:
  - name: nginx-server
    image: 172.16.1.41:5000/nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /var/log/nginx
      name: nginx-logs
  - name: log-output
    image: 172.16.1.41:5000/busybox
    command:
    - bin/sh
    args: [-c, &#39;tail -f /logdir/access.log&#39;]
    volumeMounts:
    - mountPath: /logdir
      name: nginx-logs
  volumes:
  - name: nginx-logs
    emptyDir: {}
</code></pre><p>使用 curl 执行 POST 请求，设置头部内容为 <code>application/json</code>，传过去文件中的 json 值，可以看到应答(其中 <code>status</code> 为 <code>pending</code>，表示以及接收到请求，正在准备处理)：</p>
<pre><code># curl -s -X POST -H &quot;Content-Type: application/json&quot; http://192.168.8.100:8080/api/v1/namespaces/default/pods --data @nginx_pod.json                           
{
  &quot;kind&quot;: &quot;Pod&quot;,
  &quot;apiVersion&quot;: &quot;v1&quot;,
  &quot;metadata&quot;: {
    &quot;name&quot;: &quot;nginx-server&quot;,
    &quot;namespace&quot;: &quot;default&quot;,
    &quot;selfLink&quot;: &quot;/api/v1/namespaces/default/pods/nginx-server&quot;,
    &quot;uid&quot;: &quot;888e95d0-75a9-11e6-b463-080027c09e5b&quot;,
    &quot;resourceVersion&quot;: &quot;573&quot;,
    &quot;creationTimestamp&quot;: &quot;2016-09-08T09:49:28Z&quot;
  },
  &quot;spec&quot;: {
    &quot;volumes&quot;: [
      {
        &quot;name&quot;: &quot;nginx-logs&quot;,
        &quot;emptyDir&quot;: {}
      }
    ],
    &quot;containers&quot;: [
      {
        &quot;name&quot;: &quot;nginx-server&quot;,
        &quot;image&quot;: &quot;172.16.1.41:5000/nginx&quot;,
        &quot;ports&quot;: [
          {
            &quot;containerPort&quot;: 80,
            &quot;protocol&quot;: &quot;TCP&quot;
          }
        ],
        &quot;resources&quot;: {},
        &quot;volumeMounts&quot;: [
          {
            &quot;name&quot;: &quot;nginx-logs&quot;,
            &quot;mountPath&quot;: &quot;/var/log/nginx&quot;
          }
        ],
        &quot;terminationMessagePath&quot;: &quot;/dev/termination-log&quot;,
        &quot;imagePullPolicy&quot;: &quot;Always&quot;
      }
    ],
    &quot;restartPolicy&quot;: &quot;Always&quot;,
    &quot;terminationGracePeriodSeconds&quot;: 30,
    &quot;dnsPolicy&quot;: &quot;ClusterFirst&quot;,
    &quot;nodeName&quot;: &quot;192.168.8.100&quot;,
    &quot;securityContext&quot;: {}
  },
  &quot;status&quot;: {
    &quot;phase&quot;: &quot;Pending&quot;
  }
}
</code></pre><p>返回中包含了我们提交 pod 的信息，并且添加了 <code>status</code>、<code>metadata</code> 等额外信息。</p>
<p>等一段时间去查询 pod，就可以看到 pod 的状态已经更新了：</p>
<pre><code>➜  http http://192.168.8.100:8080/api/v1/namespaces/default/pods
HTTP/1.1 200 OK
Content-Type: application/json
Date: Thu, 08 Sep 2016 09:51:29 GMT
Transfer-Encoding: chunked

{
    &quot;apiVersion&quot;: &quot;v1&quot;,
    &quot;items&quot;: [
        {
            &quot;metadata&quot;: {
                &quot;creationTimestamp&quot;: &quot;2016-09-08T09:49:28Z&quot;,
                &quot;name&quot;: &quot;nginx-server&quot;,
                &quot;namespace&quot;: &quot;default&quot;,
                &quot;resourceVersion&quot;: &quot;592&quot;,
                &quot;selfLink&quot;: &quot;/api/v1/namespaces/default/pods/nginx-server&quot;,
                &quot;uid&quot;: &quot;888e95d0-75a9-11e6-b463-080027c09e5b&quot;
            },
            &quot;spec&quot;: {
                &quot;containers&quot;: [
                    {
                        &quot;image&quot;: &quot;172.16.1.41:5000/nginx&quot;,
                        &quot;imagePullPolicy&quot;: &quot;Always&quot;,
                        &quot;name&quot;: &quot;nginx-server&quot;,
                        &quot;ports&quot;: [
                            {
                                &quot;containerPort&quot;: 80,
                                &quot;protocol&quot;: &quot;TCP&quot;
                            }
                        ],
                        &quot;resources&quot;: {},
                        &quot;terminationMessagePath&quot;: &quot;/dev/termination-log&quot;,
                        &quot;volumeMounts&quot;: [
                            {
                                &quot;mountPath&quot;: &quot;/var/log/nginx&quot;,
                                &quot;name&quot;: &quot;nginx-logs&quot;
                            }
                        ]
                    },
                    {
                        &quot;args&quot;: [
                            &quot;-c&quot;,
                            &quot;tail -f /logdir/access.log&quot;
                        ],
                        &quot;command&quot;: [
                            &quot;bin/sh&quot;
                        ],
                        &quot;image&quot;: &quot;172.16.1.41:5000/busybox&quot;,
                        &quot;imagePullPolicy&quot;: &quot;Always&quot;,
                        &quot;name&quot;: &quot;log-output&quot;,
                        &quot;resources&quot;: {},
                        &quot;terminationMessagePath&quot;: &quot;/dev/termination-log&quot;,
                        &quot;volumeMounts&quot;: [
                            {
                                &quot;mountPath&quot;: &quot;/logdir&quot;,
                                &quot;name&quot;: &quot;nginx-logs&quot;
                            }
                        ]
                    }
                ],
                &quot;dnsPolicy&quot;: &quot;ClusterFirst&quot;,
                &quot;nodeName&quot;: &quot;192.168.8.100&quot;,
                &quot;restartPolicy&quot;: &quot;Always&quot;,
                &quot;securityContext&quot;: {},
                &quot;terminationGracePeriodSeconds&quot;: 30,
                &quot;volumes&quot;: [
                    {
                        &quot;emptyDir&quot;: {},
                        &quot;name&quot;: &quot;nginx-logs&quot;
                    }
                ]
            },
            &quot;status&quot;: {
                &quot;conditions&quot;: [
                    {
                        &quot;lastProbeTime&quot;: null,
                        &quot;lastTransitionTime&quot;: &quot;2016-09-08T09:49:28Z&quot;,
                        &quot;status&quot;: &quot;True&quot;,
                        &quot;type&quot;: &quot;Initialized&quot;
                    },
                    {
                        &quot;lastProbeTime&quot;: null,
                        &quot;lastTransitionTime&quot;: &quot;2016-09-08T09:49:44Z&quot;,
                        &quot;status&quot;: &quot;True&quot;,
                        &quot;type&quot;: &quot;Ready&quot;
                    },
                    {
                        &quot;lastProbeTime&quot;: null,
                        &quot;lastTransitionTime&quot;: &quot;2016-09-08T09:49:44Z&quot;,
                        &quot;status&quot;: &quot;True&quot;,
                        &quot;type&quot;: &quot;PodScheduled&quot;
                    }
                ],
                &quot;containerStatuses&quot;: [
                    {
                        &quot;containerID&quot;: &quot;docker://8b79eeea60f27b6d3f0a19cbd1b3ee3f83709bcf56574a6e1124c69a6376972d&quot;,
                        &quot;image&quot;: &quot;172.16.1.41:5000/busybox&quot;,
                        &quot;imageID&quot;: &quot;docker://sha256:8c566faa3abdaebc33d40c1b5e566374c975d17754c69370f78c00c162c1e075&quot;,
                        &quot;lastState&quot;: {},
                        &quot;name&quot;: &quot;log-output&quot;,
                        &quot;ready&quot;: true,
                        &quot;restartCount&quot;: 0,
                        &quot;state&quot;: {
                            &quot;running&quot;: {
                                &quot;startedAt&quot;: &quot;2016-09-08T09:49:43Z&quot;
                            }
                        }
                    },
                    {
                        &quot;containerID&quot;: &quot;docker://96e64cdba7b05d4e30710a20e958ff5b8f1f359c8d16d32622b36f0df0cb353c&quot;,
                        &quot;image&quot;: &quot;172.16.1.41:5000/nginx&quot;,
                        &quot;imageID&quot;: &quot;docker://sha256:51d764c1fd358ce81fd0e728436bd0175ff1f3fd85fc5d1a2f9ba3e7dc6bbaf6&quot;,
                        &quot;lastState&quot;: {},
                        &quot;name&quot;: &quot;nginx-server&quot;,
                        &quot;ready&quot;: true,
                        &quot;restartCount&quot;: 0,
                        &quot;state&quot;: {
                            &quot;running&quot;: {
                                &quot;startedAt&quot;: &quot;2016-09-08T09:49:36Z&quot;
                            }
                        }
                    }
                ],
                &quot;hostIP&quot;: &quot;192.168.8.100&quot;,
                &quot;phase&quot;: &quot;Running&quot;,
                &quot;podIP&quot;: &quot;172.17.0.2&quot;,
                &quot;startTime&quot;: &quot;2016-09-08T09:49:28Z&quot;
            }
        }
    ],
    &quot;kind&quot;: &quot;PodList&quot;,
    &quot;metadata&quot;: {
        &quot;resourceVersion&quot;: &quot;602&quot;,
        &quot;selfLink&quot;: &quot;/api/v1/namespaces/default/pods&quot;
    }
}
</code></pre><p>可以看到 pod 已经在运行，并且给分配了 ip：<code>172.17.0.2</code>，通过 curl 也可以访问它的服务：</p>
<pre><code>[root@localhost vagrant]# curl -s http://172.17.0.2 | head -n 5
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx on Debian!&lt;/title&gt;
&lt;style&gt;
</code></pre><p>关于 API Server 提供的所有接口，可以参考官方的 [API 文档][<a href="http://kamalmarhubi.com/blog/2015/09/06/kubernetes-from-the-ground-up-the-api-server/]。" target="_blank" rel="noopener">http://kamalmarhubi.com/blog/2015/09/06/kubernetes-from-the-ground-up-the-api-server/]。</a></p>
<h2 id="kubectl-命令"><a href="#kubectl-命令" class="headerlink" title="kubectl 命令"></a>kubectl 命令</h2><p>理论上，所有 kubernetes 提供的功能都能够直接通过 HTTP API 交互来实现，但是你也看到了，非常复杂。因此 kubernetes 提供了另外了 <code>kubectl</code>  命令行，它封装了 HTTP API 的交互过程，通过一系列的子命令来操作资源。比如我们上面创建 pod 的过程就可以通过</p>
<pre><code>kubectl create -f nginx_pod.yml
</code></pre><p>一行命令实现，查看 pod 的信息也很简单：</p>
<pre><code>kubectl -s http://ip:8080 get pods
</code></pre><p>删除已经创建的 pod，可以使用 <code>delete</code> 命令：</p>
<pre><code>kubectl delete pods/nginx-server
</code></pre><p>kubectl 的用法也有<a href="http://kubernetes.io/docs/user-guide/kubectl-overview/" target="_blank" rel="noopener">详细的官方文档</a>，这里就不多说了。</p>
<h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul>
<li><a href="http://kamalmarhubi.com/blog/2015/09/06/kubernetes-from-the-ground-up-the-api-server/" target="_blank" rel="noopener">Kubernetes from the ground up: the API server</a></li>
<li><a href="http://kubernetes.io/kubernetes/third_party/swagger-ui/" target="_blank" rel="noopener">kubernetes API 文档：swagger-ui</a></li>
</ul>

                </div>
            </section>
        </article>
    </div>
    
<nav class="pagination">
    
    
    <a class="prev-post" title="使用 coreos 运行 docker 的 netns 问题" href="/2016/11/22/coreos-docker-netns-issue/">
        ← 使用 coreos 运行 docker 的 netns 问题
    </a>
    
    <span class="prev-next-post">•</span>
    
    <a class="next-post" title="kubernetes 简介： kubelet 和 pod" href="/2016/10/25/kubernetes-intro-kubelet/">
        kubernetes 简介： kubelet 和 pod →
    </a>
    
    
</nav>

    <div class="inner">
    <!-- Begin Mailchimp Signup Form -->
    <link href="//cdn-images.mailchimp.com/embedcode/classic-10_7.css" rel="stylesheet" type="text/css">
    <style type="text/css">
    	#mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; }
    	/* Add your own Mailchimp form style overrides in your site stylesheet or in this style block.
    	   We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. */
    </style>
    <div id="mc_embed_signup">
    <form action="https://cizixs.us7.list-manage.com/subscribe/post?u=2d561b8dea52d73a2e05e6dcb&amp;id=5c710f135b" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
        <div id="mc_embed_signup_scroll">
    	<h2>订阅本博客，第一时间收到文章更新</h2>
    <div class="indicates-required"><span class="asterisk">*</span> indicates required</div>
    <div class="mc-field-group">
    	<label for="mce-EMAIL">邮件地址  <span class="asterisk">*</span>
    </label>
    	<input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL">
    </div>
    	<div id="mce-responses" class="clear">
    		<div class="response" id="mce-error-response" style="display:none"></div>
    		<div class="response" id="mce-success-response" style="display:none"></div>
    	</div>    <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
        <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_2d561b8dea52d73a2e05e6dcb_5c710f135b" tabindex="-1" value=""></div>
        <div class="clear"><input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe" class="button"></div>
        </div>
    </form>
    </div>
    <script type='text/javascript' src='//s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js'></script><script type='text/javascript'>(function($) {window.fnames = new Array(); window.ftypes = new Array();fnames[0]='EMAIL';ftypes[0]='email';}(jQuery));var $mcj = jQuery.noConflict(true);</script>
    <!--End mc_embed_signup-->
    </div>

    <div class="inner">
        <div id="disqus_thread"></div>
    </div>

    
</main>

<div class="t-g-control">
    <div class="gotop">
        <svg class="icon" width="32px" height="32px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M793.024 710.272a32 32 0 1 0 45.952-44.544l-310.304-320a32 32 0 0 0-46.4 0.48l-297.696 320a32 32 0 0 0 46.848 43.584l274.752-295.328 286.848 295.808z" fill="#8a8a8a" /></svg>
    </div>
    <div class="toc-control">
        <svg class="icon toc-icon" width="32px" height="32.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M779.776 480h-387.2a32 32 0 0 0 0 64h387.2a32 32 0 0 0 0-64M779.776 672h-387.2a32 32 0 0 0 0 64h387.2a32 32 0 0 0 0-64M256 288a32 32 0 1 0 0 64 32 32 0 0 0 0-64M392.576 352h387.2a32 32 0 0 0 0-64h-387.2a32 32 0 0 0 0 64M256 480a32 32 0 1 0 0 64 32 32 0 0 0 0-64M256 672a32 32 0 1 0 0 64 32 32 0 0 0 0-64" fill="#8a8a8a" /></svg>
        <svg class="icon toc-close" style="display: none;" width="32px" height="32.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M512 960c-247.039484 0-448-200.960516-448-448S264.960516 64 512 64 960 264.960516 960 512 759.039484 960 512 960zM512 128.287273c-211.584464 0-383.712727 172.128262-383.712727 383.712727 0 211.551781 172.128262 383.712727 383.712727 383.712727 211.551781 0 383.712727-172.159226 383.712727-383.712727C895.712727 300.415536 723.551781 128.287273 512 128.287273z" fill="#8a8a8a" /><path d="M557.05545 513.376159l138.367639-136.864185c12.576374-12.416396 12.672705-32.671738 0.25631-45.248112s-32.704421-12.672705-45.248112-0.25631l-138.560301 137.024163-136.447897-136.864185c-12.512727-12.512727-32.735385-12.576374-45.248112-0.063647-12.512727 12.480043-12.54369 32.735385-0.063647 45.248112l136.255235 136.671523-137.376804 135.904314c-12.576374 12.447359-12.672705 32.671738-0.25631 45.248112 6.271845 6.335493 14.496116 9.504099 22.751351 9.504099 8.12794 0 16.25588-3.103239 22.496761-9.247789l137.567746-136.064292 138.687596 139.136568c6.240882 6.271845 14.432469 9.407768 22.65674 9.407768 8.191587 0 16.352211-3.135923 22.591372-9.34412 12.512727-12.480043 12.54369-32.704421 0.063647-45.248112L557.05545 513.376159z" fill="#8a8a8a" /></svg>
    </div>
    <div class="gobottom">
        <svg class="icon" width="32px" height="32.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M231.424 346.208a32 32 0 0 0-46.848 43.584l297.696 320a32 32 0 0 0 46.4 0.48l310.304-320a32 32 0 1 0-45.952-44.544l-286.848 295.808-274.752-295.36z" fill="#8a8a8a" /></svg>
    </div>
</div>
<div class="toc-main" style="right: -100%">
    <div class="post-toc">
        <span>TOC</span>
        <ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#简介"><span class="toc-text">简介</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#参数介绍"><span class="toc-text">参数介绍</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#安装和运行"><span class="toc-text">安装和运行</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#添加节点"><span class="toc-text">添加节点</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#和-API-Server-通信"><span class="toc-text">和 API Server 通信</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#kubectl-命令"><span class="toc-text">kubectl 命令</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#参考资料"><span class="toc-text">参考资料</span></a></li></ol>
    </div>
</div>



        

<aside class="read-next outer">
    <div class="inner">
        <div class="read-next-feed">
            
            

<article class="read-next-card"  style="background-image: url(https://cizixs-blog.oss-cn-beijing.aliyuncs.com/006tNc79ly1g1qxcn9ft3j318w0txdo6.jpg)"  >
  <header class="read-next-card-header">
    <small class="read-next-card-header-sitetitle">&mdash; Cizixs Write Here &mdash;</small>
    <h3 class="read-next-card-header-title">Recent Posts</h3>
  </header>
  <div class="read-next-divider">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
      <path d="M13 14.5s2 3 5 3 5.5-2.463 5.5-5.5S21 6.5 18 6.5c-5 0-7 11-12 11C2.962 17.5.5 15.037.5 12S3 6.5 6 6.5s4.5 3.5 4.5 3.5"/>
    </svg>
  </div>
  <div class="read-next-card-content">
    <ul>
      
      
      
      <li>
        <a href="/2018/08/26/what-is-istio/">什么是 istio</a>
      </li>
      
      
      
      <li>
        <a href="/2018/08/25/knative-serverless-platform/">serverless 平台 knative 简介</a>
      </li>
      
      
      
      <li>
        <a href="/2018/06/25/kubernetes-resource-management/">kubernetes 资源管理概述</a>
      </li>
      
      
      
      <li>
        <a href="/2018/01/24/use-prometheus-and-grafana-to-monitor-linux-machine/">使用 promethues 和 grafana 监控自己的 linux 机器</a>
      </li>
      
      
      
      <li>
        <a href="/2018/01/13/linux-udp-packet-drop-debug/">linux 系统 UDP 丢包问题分析思路</a>
      </li>
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    </ul>
  </div>
  <footer class="read-next-card-footer">
    <a href="/archives">  MORE  → </a>
  </footer>
</article>


            
            
            
        </div>
    </div>
</aside>


<footer class="site-footer outer">

	<div class="site-footer-content inner">
		<section class="copyright">
			<a href="/" title="Cizixs Write Here">Cizixs Write Here</a>
			&copy; 2019
		</section>
		<nav class="site-footer-nav">
			
            <a href="https://hexo.io" title="Hexo" target="_blank" rel="noopener">Hexo</a>
            <a href="https://github.com/xzhih/hexo-theme-casper" title="Casper" target="_blank" rel="noopener">Casper</a>
        </nav>
    </div>
</footer>






<div class="floating-header" >
	<div class="floating-header-logo">
        <a href="/" title="Cizixs Write Here">
			
                <img src="https://cizixs-blog.oss-cn-beijing.aliyuncs.com/006tNc79ly1g1qxfovpzyj30740743yg.jpg" alt="Cizixs Write Here icon" />
			
            <span>Cizixs Write Here</span>
        </a>
    </div>
    <span class="floating-header-divider">&mdash;</span>
    <div class="floating-header-title">kubernetes 简介：API Server 和 node</div>
    <progress class="progress" value="0">
        <div class="progress-container">
            <span class="progress-bar"></span>
        </div>
    </progress>
</div>
<script>
   $(document).ready(function () {
    var progressBar = document.querySelector('progress');
    var header = document.querySelector('.floating-header');
    var title = document.querySelector('.post-full-title');
    var lastScrollY = window.scrollY;
    var lastWindowHeight = window.innerHeight;
    var lastDocumentHeight = $(document).height();
    var ticking = false;

    function onScroll() {
        lastScrollY = window.scrollY;
        requestTick();
    }
    function requestTick() {
        if (!ticking) {
            requestAnimationFrame(update);
        }
        ticking = true;
    }
    function update() {
        var rect = title.getBoundingClientRect();
        var trigger = rect.top + window.scrollY;
        var triggerOffset = title.offsetHeight + 35;
        var progressMax = lastDocumentHeight - lastWindowHeight;
            // show/hide floating header
            if (lastScrollY >= trigger + triggerOffset) {
                header.classList.add('floating-active');
            } else {
                header.classList.remove('floating-active');
            }
            progressBar.setAttribute('max', progressMax);
            progressBar.setAttribute('value', lastScrollY);
            ticking = false;
        }

        window.addEventListener('scroll', onScroll, {passive: true});
        update();

        // TOC
        var width = $('.toc-main').width();
        $('.toc-control').click(function () {
            if ($('.t-g-control').css('width')=="50px") {
                if ($('.t-g-control').css('right')=="0px") {
                    $('.t-g-control').animate({right: width}, "slow");
                    $('.toc-main').animate({right: 0}, "slow");
                    toc_icon()
                } else {
                    $('.t-g-control').animate({right: 0}, "slow");
                    $('.toc-main').animate({right: -width}, "slow");
                    toc_icon()
                }
            } else {
                if ($('.toc-main').css('right')=="0px") {
                    $('.toc-main').slideToggle("fast", toc_icon());
                } else {
                    $('.toc-main').css('right', '0px');
                    toc_icon()
                }
            }
        })

        function toc_icon() {
            if ($('.toc-icon').css('display')=="none") {
                $('.toc-close').hide();
                $('.toc-icon').show();
            } else {
                $('.toc-icon').hide();
                $('.toc-close').show();
            }
        }

        $('.gotop').click(function(){
            $('html,body').animate({scrollTop:$('.post-full-header').offset().top}, 800);
        });
        $('.gobottom').click(function () {
            $('html,body').animate({scrollTop:$('.pagination').offset().top}, 800);
        });

        // highlight
        // https://highlightjs.org
        $('pre code').each(function(i, block) {
            hljs.highlightBlock(block);
        });
        $('td.code').each(function(i, block) {
            hljs.highlightBlock(block);
        });

        console.log("this theme is from https://github.com/xzhih/hexo-theme-casper")
    });
</script>



<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/1.3.9/css/lightgallery.min.css">



<script src="https://cdn.staticfile.org/lightgallery/1.3.9/js/lightgallery.min.js"></script>


<script>
	$(function () {
		var postImg = $('#lightgallery').find('img');
		postImg.addClass('post-img');
		postImg.each(function () {
			var imgSrc = $(this).attr('src');
			$(this).attr('data-src', imgSrc);
		});
		$('#lightgallery').lightGallery({selector: '.post-img'});
	});
</script>



<script>

/**
*  RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS.
*  LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/

var disqus_config = function () {
this.page.url = 'http://cizixs.com/2016/11/07/kubernetes-intro-api-server/';  // Replace PAGE_URL with your page's canonical URL variable
this.page.identifier = 'http://cizixs.com/2016/11/07/kubernetes-intro-api-server/'; // Replace PAGE_IDENTIFIER with your page's unique identifier variable
};

(function() { // DON'T EDIT BELOW THIS LINE
var d = document, s = d.createElement('script');
s.src = 'https://cizixs.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
                            


    </div>
</body>
</html>
